package br.com.kapa.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Produto implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	
	private String descricao;
	
	private double valorCusto;
	
	private double totalInsumo;
	
	private double valorVenda;
	
	private double estoque;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataCadastro;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataAlteracao;
	
	@ManyToOne
	private Unidade unidade;
	
	@OneToMany(cascade=CascadeType.ALL,mappedBy="produto", fetch=FetchType.EAGER)
	private List<ProdutoInsumo> insumos = new ArrayList<ProdutoInsumo>();


	public Produto() {
		setDataCadastro(new Date());
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public double getValorCusto() {
		return valorCusto;
	}

	public void setValorCusto(double valorCusto) {
		this.valorCusto = valorCusto;
	}

	public double getValorVenda() {
		return valorVenda;
	}

	public void setValorVenda(double valorVenda) {
		this.valorVenda = valorVenda;
	}

	public double getEstoque() {
		return estoque;
	}

	public void setEstoque(double estoque) {
		this.estoque = estoque;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Date getDataAlteracao() {
		return dataAlteracao;
	}

	public void setDataAlteracao(Date dataAlteracao) {
		this.dataAlteracao = dataAlteracao;
	}

	public Unidade getUnidade() {
		return unidade;
	}

	public void setUnidade(Unidade unidade) {
		this.unidade = unidade;
	}

	public List<ProdutoInsumo> getInsumos() {
		return insumos;
	}

	public double getTotalInsumo() {
		return totalInsumo;
	}

	public void setTotalInsumo(double totalInsumo) {
		this.totalInsumo = totalInsumo;
	}

	public void setInsumos(List<ProdutoInsumo> insumos) {
		for (ProdutoInsumo insumo : insumos) {
			addInsumo(insumo.getMateriaPrima(), insumo.getQuantidade());
		}
	}
	
	public void addInsumo(MateriaPrima materiaprima, double quantidade) {
		ProdutoInsumo insumo = new ProdutoInsumo();
		
		insumo.setProduto(this);
		insumo.setQuantidade(quantidade);
		insumo.setMateriaPrima(materiaprima);
		materiaprima.setEstoque(materiaprima.getEstoque()-(quantidade*this.getEstoque()));

		this.insumos.add(insumo);
		
		//calcular o valor gasto em materia prima por produto
		setTotalInsumo(getTotalInsumo()+(materiaprima.getPrecoUnitario()*quantidade));
		
		//se foi adicionado uma nova materia prima ao produto entao re-calcular o custo
		calcularValorCusto();
		calcularValorVenda();
	}
	
	public void calcularValorCusto() {
		double margem_despesa = 0.30;
		double despesa = getTotalInsumo()*margem_despesa;
		
		setValorCusto(getTotalInsumo()+despesa);
		
	}
	
	public void calcularValorVenda() {
		double margem_lucro = 1.00;
		double lucro = margem_lucro*getValorCusto();
		
		setValorVenda(getValorCusto()+lucro);
	}

	
	
	@Override
	public String toString() {
		return "Produto [id=" + id + ", descricao=" + descricao
				+ ", valorCusto=" + valorCusto + ", valorVenda=" + valorVenda
				+ ", estoque=" + estoque ;
	}

}
